home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / thf / thf.c next >
Encoding:
C/C++ Source or Header  |  1993-07-08  |  13.8 KB  |  804 lines

  1.  
  2. /*
  3.     THf再び…
  4.  
  5.         By 五味
  6.  
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12.  
  13. #define    uchar    unsigned char
  14.  
  15. #define    MAX_LB    4096
  16. #define    MAX_RK    128
  17.  
  18. /*
  19.  
  20.     変数定義
  21.  
  22.  
  23. */
  24.     FILE    *rp,*wp;        /* 読み込み、書き込みのファイル    */
  25.     char    fname[128],rname[128];    /* 書き込み、読み込みファイル名    */
  26.     char    linebuf[MAX_LB+2];    /* 行加工のバッファ        */
  27.     char    ichar;            /* インデント用文字        */
  28.     char    *u;            /* ファイル名加工用ポインタ    */
  29.     int    tof;            /* インデントの深さ        */
  30.     int    sof;            /* 文章の横のオフセット        */
  31.     int    vof;            /* 加工時のポインタ        */
  32.     int    ilen;            /* インデントの単位幅        */
  33.     int    i,j,l;            /* 汎用(ループ等)数値        */
  34.     int    letter;            /* 文字(半角か、全角の最初)    */
  35.     int    letter2;        /* 文字(全角の2バイト目)    */
  36.     int    wide;            /* 文章の全体幅            */
  37.     int    line;            /* 行カウンタ            */
  38.     int    nulis;            /* 空行をスキップにするか    */
  39.     int    rema;            /* 可能性フラグ            */
  40.     int    ntran;            /* 非加工フラグ            */
  41.     int    tmpi;            /* テンポラリ・インデント    */
  42.     int    tmps;            /* テンポラリ・インデント補助    */
  43.     int    fret;            /* フォーマット・リターン    */
  44.     int    frets;            /* フォーマット・リターン補助    */
  45.  
  46.     char    form[1024];        /* フォーマット記録        */
  47.     char    formbak[1024];        /* フォーマット記録の保存用    */
  48.     int    howbak;            /* フォーマット一時解除か否か    */
  49.     int    forp;            /* フォーマットのポインタ    */
  50.     int    forep;            /* フォーマットリピートポインタ    */
  51.     int    forepend;        /* フォーマットエンドポインタ    */
  52.     char    forbuf[4096];        /* フォーマット展開バッファ    */
  53.     char    strbuf[4096];        /* 文字列展開バッファ        */
  54.     int    forbp;            /* フォーマット展開の現在値    */
  55.     int    folg;            /* 展開中(1)か否か(0)        */
  56.     int    fof;            /* フォーマットエンドフラグ    */
  57.     int    dumo;            /* ダミー文字列フラグ        */
  58.     uchar    othch;            /* 区切り文字            */
  59.  
  60.     int    istab;            /* タブ中か            */
  61.     int    tabsize;        /* タブサイズ            */
  62.  
  63.  
  64. unsigned int    rc[MAX_RK]={    '、','。',',','.','・',':',';','?',
  65.                 '!','゛','゜','ヽ','ヾ','ゝ','ゞ','〃',
  66.                 '々','ー','―','‐','~','…','‥','’',
  67.                 '”',')','〕',']','}','〉','》','」',
  68.                 '』','】','>','°','′','″','℃','%',
  69.                 '≫','‰','♯','♭','♪','Å','ぁ','ぃ',
  70.                 'ぅ','ぇ','ぉ','っ','ゃ','ゅ','ょ','ァ',
  71.                 'ィ','ゥ','ェ','ォ','ッ','ャ','ュ','ョ',
  72.                 'ゎ','ヵ','ヶ','ヮ',' ','\n'        };
  73.                         /* 留める文字(全角)    */
  74. unsigned int    fc[MAX_RK]={    '‘','“','(','〔','[','〈','《','「',
  75.                 '『','【','+','-','±','×','÷','<',
  76.                 '≪','√','\n'                };
  77.                         /* 吐き出す文字(全角)    */
  78. unsigned char    ra[MAX_RK] =    "#$%),.、。」>]?!ァィゥェォッー\t \n";
  79.                         /* 留める文字(半角)    */
  80. unsigned char    fa[MAX_RK] =    "(「[<\n";
  81.                         /* 吐き出す文字(半角)    */
  82. char    *ko[]={    "□","■","○","●","☆","★","◇","◆","§","◎" };
  83.                         /* 項目abの文字        */
  84.  
  85. /*
  86.  
  87.     関数定義
  88.  
  89.  
  90. */
  91.  
  92. void shift(int val,FILE *pp)    /* 空白(タブ)で横ずらし    */
  93. {
  94.     for( i=0 ; i<val/tabsize ; i++ )
  95.         fputc('\t',pp);
  96.     for( i=0 ; i<val%tabsize ; i++ )
  97.         fputc(ichar,pp);
  98.  
  99.     return;
  100. }
  101.  
  102. void testinit(void)        /* 書式関係の初期化    */
  103. {
  104.     forp    = 0;
  105.     forep    = 0;
  106.     forbuf[0] = 0;
  107.     forbp    = 0;
  108.     folg    = 0;
  109.     fof    = 0;
  110.     forepend= 0;
  111. }
  112.  
  113. char *tok(char *pp)        /* 書式の単位文字列の読み取り    */
  114. {
  115.     int    ll,ol;
  116.  
  117.     while( (ll=fgetc(rp))!=EOF )
  118.         if( ll!=othch && ll!='\n' )
  119.             break;
  120.  
  121.     if( ll=='/' )
  122.         {
  123.         *pp = '\0';
  124.         while( (ll=fgetc(rp))!=EOF )
  125.             if( ll==othch || ll=='\n' )
  126.                 break;
  127.         return(pp);
  128.         }            /* ヌル文字列処理    */
  129.     else
  130.         ungetc(ll,rp);
  131.  
  132.     ol='\0';
  133.     while( (ll=fgetc(rp))!=EOF )
  134.         if( ll==othch || ll=='\n' )
  135.             break;
  136.         else
  137.             *(pp++) = ol = ll;
  138.     if( ol=='/' )
  139.         {
  140.         fof=1;
  141.         *(pp-1)='\0';
  142.         }            /* 書式ループ終了指定子処理    */
  143.  
  144.     if( ll==EOF )
  145.         {
  146.         printf(" 正常終了\n");
  147.         exit(0);
  148.         }
  149.  
  150.     *pp = '\0';
  151.     return(pp);
  152.  
  153. }
  154.  
  155. int ktest(FILE *pp)        /* 書式やタブからの文字の読み取り    */
  156. {
  157.     int    ll;
  158.  
  159.         if( istab>0 )
  160.             {
  161.             istab--;
  162.             return(ichar);
  163.             }
  164.     else    if( folg!=0 )
  165.             {
  166.             ll = forbuf[forbp++];
  167.             if( forbuf[forbp]==0 )
  168.                 folg=0;
  169.             if( ll=='\t' && othch=='\n' )
  170.                 {
  171.                 istab=1;
  172.                 for( i=0 ; (vof+i+1)%tabsize!=0 ; i++ );
  173.                 istab+=i;
  174.                 return(ktest(pp));
  175.                 }
  176.             return(ll);
  177.             }
  178.     else    if( forp==forepend && forepend!=0 )
  179.             {
  180.             if( fof==1 )
  181.                 {
  182.                 forp    = forepend+1;
  183.                 forepend= 0;
  184.                 fof    = 0;
  185.                 return( ktest(pp) );
  186.                 }    /* 後尾のスラッシュでの書式終了*/
  187.             else
  188.                 {
  189.                 forp=forep;
  190.                 if( form[forp]==0 )
  191.                     {
  192.     printf("%s %d: 書式設定が無限ループしています.\n",rname,line);
  193.                     exit(1);
  194.                     }
  195.                 return( ktest(pp) );
  196.                 }
  197.             }
  198.     else    if( form[forp]=='\0' )
  199.             {
  200.             testinit();
  201.             return(0);
  202.             }
  203.     else    if( form[forp]=='&' )
  204.             {
  205.             forep    = ++forp;
  206. for( forepend=forp ; form[forepend]!='\0' && form[forepend]!='&' ; forepend++);
  207.             return( ktest(pp) );
  208.             }
  209.     else    if( form[forp]=='\\' )
  210.             {
  211.             forp++;
  212.             switch(form[forp++])
  213.                 {
  214.             case'n':
  215.                 return('\n');
  216.             case't':
  217.                 return('\t');
  218.             case'r':
  219.                 folg = 1;
  220.                 l = atoi(&(form[forp]));
  221.                 do    {
  222.                     letter=form[forp++];
  223.                     }while( letter>='0' && letter <='9' );
  224.                 forp--;
  225.                 for( i=0 ; i<l ; i++ )
  226.                     forbuf[i]=ichar;
  227.                 forbuf[l]='\0';
  228.                 forbp     = 0;
  229.                 return( ktest(pp) );
  230.                 }
  231.             }
  232.     else    if( form[forp]!='%' )
  233.             return( form[forp++] );
  234.     else
  235.         {
  236.         forp++;
  237.         folg = 1;
  238.         tok(strbuf);        /* 文書からの文字列の読み出し    */
  239.  
  240.         if( form[forp]=='<' )
  241.             {            /* ベース式    */
  242.             forp++;
  243.             for( l=0 ; form[forp+l]!='>' ; l++ )
  244.                 forbuf[l] = form[forp+l];
  245.             forbuf[l] = 0;
  246.             forp += l+1;
  247.  
  248.             j=l-strlen(strbuf);
  249.             if( form[forp]=='-' )
  250.                 j=0;
  251.  
  252.             if( l<strlen(strbuf) )
  253.                 strcpy(forbuf,strbuf);
  254.             else
  255.                 {
  256.                 do    {
  257.                     letter = form[forp++];
  258.                     }while( letter!='s' && letter!='c' );
  259.                 if( letter=='c' )
  260.                     j = (l-strlen(strbuf))/2;
  261.                 for( l=0 ; l<strlen(strbuf) ; l++ )
  262.                     forbuf[j+l] = strbuf[l];
  263.                 }
  264.             }
  265.         else
  266.         if( form[forp]=='Z' )        /* 右寄せ式    */
  267.             {
  268.             forp++;
  269.             for( i=0 ; i<wide-strlen(strbuf) ; i++ )
  270.                 forbuf[i]=ichar;
  271.             strcpy(&forbuf[i],strbuf);
  272.             }
  273.         else
  274.         if( form[forp]=='C' )        /* センタリング式    */
  275.             {
  276.             forp++;
  277.             for( i=0 ; i<(wide-strlen(strbuf))/2 ; i++ )
  278.                 forbuf[i]=ichar;
  279.             strcpy(&forbuf[i],strbuf);
  280.             }
  281.         else
  282.             {                /* width式    */
  283.             j = atoi(&(form[forp]));
  284.             do    {
  285.                 letter = form[forp++];
  286.                 }while( letter!='s' && letter!='c' );
  287.  
  288.             if( j==0 || j<=strlen(strbuf) )
  289.                 strcpy(forbuf,strbuf);
  290.             else
  291.                 {
  292.  
  293.                 if( j<0 )
  294.                     {
  295.                     j*=-1;
  296.                     if( (l=j-strlen(strbuf))<0 )
  297.                         l=0;
  298.                     }
  299.                 else
  300.                     l=0;
  301.  
  302.                 if( letter=='c' )
  303.                     l = (j-strlen(strbuf))/2;
  304.  
  305.                 for( i=0 ; i<j ; i++ )
  306.                     forbuf[i] = ichar;
  307.                 forbuf[i] = 0;
  308.  
  309.                 for( i=0 ; i<j && strbuf[i]!=0 ; i++ )
  310.                     forbuf[l+i] = strbuf[i];
  311.  
  312.                 }
  313.             }
  314.  
  315.         forbp = 0;
  316.         return( ktest(pp) );
  317.  
  318.         }
  319.  
  320. }
  321.  
  322. int test(FILE *pp)        /* EOF判定の付いたfgetc        */
  323. {
  324.     int    ll;
  325.  
  326.     if( ( ll=fgetc(pp) )==EOF )
  327.         {
  328.         printf(" 正常終了\n");
  329.         exit(0);
  330.         }
  331.  
  332.     return(ll);
  333. }
  334.  
  335. char *center(char *lbuf,FILE *pp)    /* センタリング    */
  336. {
  337.     size_t    ls;
  338.  
  339.     if( (ls=strlen(lbuf))>=(wide-sof) )
  340.         {
  341.         printf("%s %d: センタリングの文字が長すぎます.\n",rname,line);
  342.         exit(1);
  343.         }
  344.  
  345.     shift(sof+(wide-sof-ls)/2,pp);
  346.  
  347.     fprintf(wp,"%s\n",lbuf);
  348.     return(lbuf);
  349.  
  350. }
  351.  
  352. char *right(char *lbuf,FILE *pp)    /* 右寄せ    */
  353. {
  354.     size_t    ls;
  355.  
  356.     if( (ls=strlen(lbuf))>=wide )
  357.         {
  358.         printf("%s %d: 右寄せの文字が長すぎます.\n",rname,line);
  359.         exit(1);
  360.         }
  361.  
  362.     shift(wide-ls,pp);
  363.  
  364.     fprintf(wp,"%s\n",lbuf);
  365.     return(lbuf);
  366.  
  367. }
  368.  
  369. void indent(FILE *pp)            /* インデントをつける    */
  370. {
  371.     vof = sof + tmpi*tmps + tof*ilen;
  372.  
  373.     shift(vof,pp);
  374.  
  375.     tmps = 1;
  376.     istab= 0;
  377. }
  378.  
  379. int pararead(FILE *pp)            /* ストリームから数字を読み取る    */
  380. {
  381.     int    ll;
  382.  
  383.     do    {
  384.         ll = test(rp);
  385.         }while( ll=='\t' || ll==' ' );
  386.     ungetc(ll,rp);
  387.  
  388.     fgets(linebuf,MAX_LB+1,rp);
  389.     return(atoi(linebuf));
  390.  
  391. }
  392.  
  393. char *bunread(FILE *pp)            /* ストリームから文字列を読み取る*/
  394. {
  395.     int    ll;
  396.  
  397.     do    {
  398.         ll = test(rp);
  399.         }while( ll=='\t' || ll==' ' );
  400.     ungetc(ll,rp);
  401.  
  402.     fgets(linebuf,MAX_LB+1,rp);
  403.     *(linebuf+strlen(linebuf)-1) = 0;
  404.     return(linebuf);
  405.  
  406. }
  407.  
  408. void cont_read(void)        /* コントロール行を処理する    */
  409. {
  410.  
  411.     switch( letter=test(rp) )
  412.         {
  413.     case'a':
  414.         tof++;            /* 順序関係あり        */
  415.     case'b':
  416.         fprintf(wp,"\n");
  417.         letter=test(rp);
  418.         if( '0'<=letter && letter<='9' )
  419.             {
  420.             indent(wp);
  421.             fprintf(wp,"%s%s\n\n",ko[letter-'0'],bunread(rp));
  422.             }
  423.         else
  424.         if( letter=='a' )
  425.             {
  426.             center(bunread(rp),wp);
  427.             fprintf(wp,"\n");
  428.             }
  429.         else
  430.             {
  431.             indent(wp);
  432.             fprintf(wp,"%s\n\n",bunread(rp));
  433.             }
  434.         break;
  435.     case'c':
  436.         center(bunread(rp),wp);
  437.         break;
  438.  
  439.     case'd':
  440.         if( (letter=test(rp))=='d' )
  441.             if( howbak )
  442.                 {
  443.                 strcpy(form,formbak);
  444.                 howbak=0;
  445.                 }
  446.             else
  447.                 {
  448.                 strcpy(formbak,form);
  449.                 howbak=1;
  450.                 }
  451.         else
  452.         if( letter!='i' )
  453.             {
  454.             ungetc(letter,rp);
  455.             if( letter=='\n' )
  456.                 strcpy(form,"%s");
  457.             else
  458.                 {
  459.                 do    {
  460.                     letter = test(rp);
  461.                     }while( letter=='\t' || letter==' ' );
  462.                 for( i=0 ; (letter2=test(rp))!=letter ; i++ )
  463.                     form[i] = letter2;
  464.                 form[i] = 0;
  465.                 }
  466.             }
  467.         testinit();
  468.         while( test(rp)!='\n' );
  469.         break;
  470.  
  471.     case'i':
  472.         letter=test(rp);
  473.         if( letter=='w' )
  474.             ilen = pararead(rp);
  475.         else
  476.         if( letter=='c' )
  477.             {
  478.         do{ letter = test(rp);    }while( letter=='\t' || letter==' ' );
  479.             for( i=0 ; (letter2=test(rp))!=letter ; i++ )
  480.                 ichar = letter2;
  481.             while( test(rp)!='\n' );
  482.             }
  483.         else
  484.         if( letter=='\n' )
  485.             tof++;
  486.         else
  487.             tof += pararead(rp);
  488.  
  489.  
  490.         fprintf(wp,"\n");
  491.         break;
  492.  
  493.     case'n':
  494.         if( (letter=test(rp))=='s' )
  495.             nulis = 1;
  496.         else
  497.             {
  498.             ungetc(letter,rp);
  499.             nulis = 0;
  500.             }
  501.  
  502.         while( test(rp)!='\n' );
  503.         break;
  504.  
  505.     case'o':
  506.         letter=test(rp);
  507.         if( letter=='\n' )
  508.             tof--;
  509.         else
  510.             tof -= pararead(rp);
  511.  
  512.         if( tof<0 ) tof=0;
  513.  
  514.         fprintf(wp,"\n");
  515.         break;
  516.  
  517.     case'r':
  518.         letter=test(rp);
  519.         if( letter=='\n' )
  520.             fprintf(wp,"\n");
  521.         else
  522.             {
  523.             ungetc(letter,rp);
  524.             j = pararead(rp);
  525.             for( i=0 ; i<j ; i++ )
  526.                 fprintf(wp,"\n");
  527.             }
  528.  
  529.         break;
  530.  
  531.     case'm':
  532.         fprintf(wp,"\n\n\n\n\n");
  533.         tof=0;                /* 順変更不可    */
  534.     case's':
  535.         letter = test(rp);
  536.         if( letter=='i' )
  537.             tmpi = pararead(rp);
  538.         else
  539.             {
  540.             fprintf(wp,"\n");
  541.             indent(wp);
  542.             fprintf(wp,"【%s】\n\n",bunread(rp));
  543.             tof++;
  544.             }
  545.         break;
  546.  
  547.     case't':
  548.         letter = test(rp);
  549.         if( letter=='o' )
  550.             {
  551.             othch='\t';
  552.             while( test(rp)!='\n' );
  553.             }
  554.         else
  555.         if( letter=='n' )
  556.             {
  557.             othch='\r';
  558.             while( test(rp)!='\n' );
  559.             }
  560.         else
  561.         if( letter=='s' )
  562.             tabsize = pararead(rp);
  563.         else
  564.             {
  565.             ungetc(letter,rp);
  566.             fprintf(wp,"\n\n");
  567.             center(bunread(rp),wp);
  568.             fprintf(wp,"\n\n");
  569.             }
  570.         break;
  571.  
  572.     case'u':
  573.         ntran ^= 1;
  574.         while( test(rp)!='\n' );
  575.         break;
  576.  
  577.     case'w':
  578.         wide = pararead(rp);
  579.         break;
  580.  
  581.     case'f':
  582.         fret = pararead(rp);
  583.         break;
  584.  
  585.     case'x':
  586.         sof = pararead(rp);
  587.         break;
  588.  
  589.     case'z':
  590.         right(bunread(rp),wp);
  591.         break;
  592.  
  593.         }
  594.  
  595. }
  596.  
  597. void tform(void)        /* 読んだ文字を整形する(禁足処理等)    */
  598. {
  599.  
  600.     if( frets==1 )
  601.         {
  602.         for( i=0 ; i<fret ; i++ )
  603.             fprintf(wp,"\n");
  604.         frets=0;
  605.         }
  606.  
  607.     indent(wp);
  608.     if( vof >= wide )
  609.         {
  610.     printf("%s %d: インデントが深すぎて、文が書けません.",rname,line);
  611.         exit(1);
  612.         }
  613.  
  614.     while( (letter=ktest(rp))!=NULL )
  615.         {
  616.         if( 0x80<letter && letter<0xA0 || 0xDF<letter )
  617.             {
  618.             letter2=ktest(rp);
  619.             if( vof+2 > wide )
  620.                 {
  621.                 rema = 0;
  622.     for( i=0 ; rc[i]!='\n' ; i++ )
  623.         if( rc[i]==((unsigned)letter2 + (unsigned)letter*0x100) )
  624.             rema = 1;
  625.  
  626.                 if( rema==0 )
  627.                     {
  628.                     fprintf(wp,"\n");
  629.                     indent(wp);
  630.                     }
  631.                 }
  632.             else if( vof+4 > wide )
  633.                 {
  634.                 rema = 0;
  635.     for( i=0 ; fc[i]!='\n' ; i++ )
  636.         if( fc[i]==((unsigned)letter2 + (unsigned)letter*0x100) )
  637.             rema = 1;
  638.  
  639.                 if( rema==1 )
  640.                     {
  641.                     fprintf(wp,"\n");
  642.                     indent(wp);
  643.                     }
  644.                 }
  645.  
  646.  
  647.             fputc((char)letter ,wp);
  648.             fputc((char)letter2,wp);
  649.             vof += 2;
  650.  
  651.             }
  652.         else
  653.             {
  654.             if( vof > wide )
  655.                 {
  656.                 rema = 0;
  657.  
  658.                 for( i=0 ; ra[i]!='\n' ; i++ )
  659.                     if( ra[i]==(uchar)letter )
  660.                         rema = 1;
  661.  
  662.                 if( rema==0 )
  663.                     {
  664.                     fprintf(wp,"\n");
  665.                     indent(wp);
  666.                     }
  667.                 }
  668.             else if( vof+1 > wide )
  669.                 {
  670.                 rema = 0;
  671.  
  672.                 for( i=0 ; fa[i]!='\n' ; i++ )
  673.                     if( fa[i]==(uchar)letter )
  674.                         rema = 1;
  675.  
  676.                 if( rema==1 )
  677.                     {
  678.                     fprintf(wp,"\n");
  679.                     indent(wp);
  680.                     }
  681.                 }
  682.  
  683.  
  684.             vof++;
  685.             fputc((char)letter,wp);
  686.  
  687.             if( letter=='\n' )
  688.                 {
  689.                 tmps=0;        /* リターンならsiが無効    */
  690.                 indent(wp);
  691.                 }
  692.  
  693.             }
  694.  
  695.  
  696.  
  697.  
  698.         }
  699.  
  700.  
  701.     fprintf(wp,"\n");
  702.     if( fret>0 ) frets=1;
  703.  
  704. }
  705.  
  706. void main(int argc,char *argv[],char *envp[])        /* メイン    */
  707. {
  708.  
  709.     printf("\n “THf”テキスト・フォーマッタ V2.3a");
  710.     printf("\n   (c) Hisashi Gomi  1993/1/30\n\n");
  711.  
  712.     if( argc==1 )
  713.         {
  714.         printf("   [使い方]  THf <入力ファイル名> [出力時の拡張子]\n");
  715.         exit(0);
  716.         }
  717.  
  718.     strcpy(rname,argv[1]);
  719.     if( (u=strchr(rname,'.'))==NULL )
  720.         strcat(rname,".thf");
  721.  
  722.     if( (rp = fopen(rname,"r"))==NULL )
  723.         {
  724.         printf("%s : ファイルがオープンできません.\n",rname);
  725.         exit(2);
  726.         }
  727.  
  728.  
  729.     strcpy(fname,rname);
  730.      u = strchr(fname,'.');
  731.     *u = 0;
  732.  
  733.     if( argc==2 )
  734.         strcat(fname,".doc");
  735.     else
  736.         {
  737.         strcat(fname,".");
  738.         strcat(fname,argv[2]);
  739.         }
  740.  
  741.     if( (wp = fopen(fname,"w"))==NULL )
  742.         {
  743.         printf("%s : ファイルがオープンできません.\n",fname);
  744.         exit(2);
  745.         }
  746.  
  747.  
  748.  
  749.     sof   = 0;
  750.     tof   = 0;
  751.     ilen  = 4;
  752.     ichar = ' ';
  753.     othch = '\n';
  754.     wide  = 72;
  755.     line  = 1;
  756.     nulis = 0;
  757.     ntran = 0;
  758.     tmpi  = 0;
  759.     fret  = 0;
  760.     frets = 0;
  761.     istab = 0;
  762.     tabsize = 8;
  763.     howbak= 0;
  764.  
  765.  
  766.     testinit();
  767.     strcpy(form,"%s");
  768.  
  769.  
  770.     while( 1 )
  771.         {
  772.         tmps = 0;
  773.  
  774.         if( (letter=test(rp))=='.' )
  775.             {
  776.             cont_read();
  777.             frets = 0;
  778.             }
  779.         else if( ntran==1 )
  780.             {
  781.             ungetc(letter,rp);
  782.             fgets(linebuf,MAX_LB+1,rp);
  783.             fprintf(wp,"%s",linebuf);
  784.             }
  785.         else if( letter=='\n' )
  786.             {
  787.             fprintf(wp,"\n");
  788.             if( nulis!=0 && tof>0 )
  789.                 tof--;
  790.             }
  791.         else if( letter=='#' )
  792.             while( test(rp)!='\n' );
  793.         else
  794.             {
  795.             ungetc(letter,rp);
  796.             tform();
  797.             }
  798.  
  799.         line++;
  800.  
  801.         }
  802.  
  803. }
  804.